// channel练习
// 1. 启动一个goroutine,生成100个数发送到ch1
// 2. 启动一个goroutine,从ch1中取值,计算其平方放到ch2中
// 3. 在main中 从ch2取值打印出来

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var once sync.Once

func f(ch1 chan<- int) {
	defer wg.Done()
	for i := 0; i < 100; i++ {
		ch1 <- i
	}
	close(ch1)
}

// 参数chan<-为只发送 <-chan为只接收
func f1(ch1 <-chan int, ch2 chan<- int) {
	defer wg.Done()
	for i := 0; i < 100; i++ {
		x := <-ch1
		sum := x * x
		ch2 <- sum
	}
	once.Do(func() { close(ch2) }) // 确保某个操作只执行一次
}

func main() {
	a := make(chan int, 100)
	b := make(chan int, 100)
	wg.Add(2)
	go f(a)
	go f1(a, b)
	wg.Wait()
	for value := range b {
		fmt.Printf("%d\n", value)
	}
}
